package com.iamteer.day12;

/**
主要回顾：String 类

    new String("abc");
        会创建 2 个对象，一个位于字符串常量池，一个位于堆内存中
    
    ==
        用于比较引用类型数据时，比较两个对象的内存地址
        
    equals
        默认情况下比较的也是两个对象的内存地址，但 String 类把该方法重写了，比较的是两个对象的内容（字符）
*/

public class LearnString {
    public static void main(String[] args) {
        
        String str1 = "hello";    //方法区中的字符串常量池中没有这个字符串，创建一个，str1 指向该字符串地址
        String str2 = "hello";    //方法区中已经有这个字符串，不创建，直接把 str2 指向该字符串地址
        
        //new 会在堆内存中新建对象。先看看方法区中的字符串常量池中有没有这个字符串，如果没有，先创建一个，并且在堆内存中复制一份，返回堆内存中的该对象的地址。
        
        String str3 = new String("hello");    //方法区中已经有这个字符串，不创建，直接复制一份到堆内存里，并把 str3 指向该对象的堆内存地址
        String str4 = new String("hello");    //方法区中已经有这个字符串，不创建，直接复制一份到堆内存里，并把 str4 指向该对象的堆内存地址
        
        System.out.println("str1 == str2 ? " + (str1 == str2) );    //True
        System.out.println("str2 == str3 ? " + (str2 == str3) );    //False
        System.out.println("str3 == str4 ? " + (str3 == str4) );    //False
        System.out.println("str3.equals(str4) ? " + (str3.equals(str4)) );//True
        
        test(null);    //故意传入空指针测试
    }
    
    public static void test(String str){
//        if (str.equals("中国")) {    //这种情况下，会出现 NullPointerException
        if ("中国".equals(str)) {      //而这种则可以避免异常
            System.out.println("Right!");
        }else {
            System.out.println("Wrong!");
        }
    }
}